#pragma once
#include <iostream>
#include "socket.hpp"
#include "daemon.hpp"
#include "PthreadPool.hpp"
#include "task.hpp"
#include "SerResource.hpp"
namespace MyServer
{
    class TcpSer
    {
    public:
        TcpSer(const uint16_t port)
            :_listensock(new SocketInter::SockIn(port))
            ,_acceptfd(-1)
        {}
      
        void InitSer()
        {
            _listensock->Socket();//申请套接字
            _listensock->InitSockaddr();//填写inetaddr_in 结构体字段
            _listensock->Bind();//绑定端口,服务器ip默认绑定"0.0.0.0
            _listensock->Listen();//设置监听状态
        }
        void run()
        {
            MyResource::SerResource * sr = new MyResource::SerResource();//预加载服务器资源
            MyDaemon::Daemon();//设置守护进程
            auto tp = mythpool::ThPool<mytask::Task>::GetOnceCase();//获取线程池任务队列,用来处理客户端请求
            tp->inittp();

            signal(SIGCHLD,SIG_IGN);//忽略17号信号,避免等待子进程

            while(true)
            {
                _acceptfd = _listensock->Accept();//接受用户请求,生成已连接的套接字
               
                tp->push(mytask::Task(_acceptfd,_listensock,sr));//将请求交给线程池处理
                
            }
            delete sr;
            _listensock->Close();//关闭子进程的监听套接字
        }
    private:
        SocketInter::SockIn *_listensock;
        int _acceptfd;
       
    };
}